#groovy #json #gpath 

#### Настройка Groovy работы с Json
1. Подключить зависимость для работы с Json:
```
<dependency>
    <groupId>org.apache.groovy</groupId>
    <artifactId>groovy-json</artifactId>
    <version>${version}</version>
</dependency>
```
2. Импортировать библиотеку и использовать в программе:
```groovy
  import groovy.json.JsonSlurper;

  def jsonSlurper = new JsonSlurper();
  def json = jsonSlurper.parseText '''
    { "name": "Irma",
      "age": 31,
      "city": "Novosibirsk"
    }'''

  println json.find{it.getKey() == 'age'}.getValue()
```

#### Работа с Json
Groovy с Json работает по принципу получения элементов Map и Array, в зависимости полученного типа
данных соответствующим образом происходит работа. Для обхода всех элементов используется внутренняя
переменная it.
```groovy
  import groovy.json.JsonSlurper;

  def jsonSlurper = new JsonSlurper();
  def json = jsonSlurper.parseText '''
    { "name": "Irma",
      "age": 31,
      "city": "Novosibirsk"
    }'''
  def map = [ name: "Irma", age: 31, city: "Novosibirsk" ]

// Поиск по объекту и по json происходит аналогично через внутреннюю переменную it
  println json.find{it.getKey() == 'age'}.getValue()
    // Output: 31
  println map.find{it.getKey() == 'age'}.getValue()
    // Output: 31
```

#### Примеры выборки c List
```groovy
  import groovy.json.JsonSlurper;

  def jsonSlurper = new JsonSlurper();
  def json = jsonSlurper.parseText '''{
  "array": [
    {
      "name": "Gene",
      "browser": "Google Chrome"
    },
    {
      "name": "Ilena",
      "browser": "Opera"
    },
    {
      "name": "Joseph",
      "browser": "Google Chrome"
    },
    {
      "name": "Andry",
      "browser": "Safari"
    },
    {
      "name": null,
      "browser": "Safari"
    }
  ]}'''

// Проверка наличия ключа и равенства указанному значению
  println json["array"].find{ it.any { it.key == "name" && it.value == "Andry" } }["name"] == "Andry"
    // Output: true
// Пример ошибочной проверки отсутствующего ключа при проверке значения
  println json["array"].find{ it.any { it.key == "notFoundKey" && it.value == "Andry" } }["notFoundKey"] == "Andry"
    // Output: Caught: java.lang.NullPointerException

// Проверка наличия ключа и равенство значения элемента null
  println json["array"].find{ it.any { it.key == "name" && it.value == null } }["name"] == null
    // Output: true
// Пример ошибочной проверки отсутствующего ключа при проверке на null
  println json["array"].find{ it.any { it.key == "notFoundKey" && it.value == null } }["notFoundKey"] == null
    // Output: Caught: java.lang.NullPointerException
```

#### Примеры выборки c Map
```groovy
  import groovy.json.JsonSlurper;

  def jsonSlurper = new JsonSlurper();
  def json = jsonSlurper.parseText '''{
    "map": {
      "submap1": {
      "name": "Gene",
      "browser": "Google Chrome"
    },
    "submap2": {
      "name": "Ilena",
      "browser": "Opera"
    },
    "submap3": {
      "name": "Joseph",
      "browser": "Google Chrome"
    },
    "submap4": {
      "name": "Andry",
      "browser": "Safari"
    },
    "submap5": {
      "name": null,
      "browser": "Safari"
    }
  }}'''

// Проверка наличия ключа и равенства указанному значению
  println json["map"]["submap3"].find{ it.key == "name"}.value == "Joseph"
    // Output: true
// Пример ошибочной проверки отсутствующего ключа при проверке значения
  println json["map"]["submap3"].find{ it.key == "notFoundKey"}.value == "Joseph"
    // Output: Caught: java.lang.NullPointerException

// Проверка наличия ключа и равенство значения элемента null
  println json["map"]["submap5"].find{ it.key == "name" && it.value == null }.value == null
    // Output: true
// Пример ошибочной проверки отсутствующего ключа при проверке на null
  println json["map"]["submap5"].find{ it.key == "notFoundKey" && it.value == null }.value == null
    // Output: Caught: java.lang.NullPointerException
```
#### Библиотека запросов
```groovy
	// Получение элемента по ключу и проверка содержания значения
	// В качестве проверки вместо contains() можно использовать equals()
	// Все три примера ниже аналогичны, отличаются только ответом в случае отсутствия ключа или значения
findAll{ it.getAt('keyName').contains('textToContains') }
findAll{ it['keyName'].contains('textToContains') }
findAll{ it.find{ it.getKey().equals('keyName') && it.getValue().contains('textToContains') } }

	// Проверки contains()
keyName.contains('textToContains') или keyName.contains('textToContains' == true) или keyName.contains('textToContains'.equals(true))
	// Проверки not contains()
keyName == /^(&!textToContains.**)/
keyName.contains('textToContains' == false) или keyName.contains('textToContains'.equals(false))
keyName.indexOf('textToContains'.equals(-1))
find{ it.getKey().equals('keyName') }.getValue() != 'textToContains'

	// Для првоерок по всему тексту использовать toString()
toString().contains('textToContains')

	// Проверка наличия ключа
containsKey('keyName')

	// TODO Проверить разницу в работе методов и дополнить описание при необходимости
find{ it.getKey() == 'value' }.getVakue() != null
find{ it.getKey().equals('value') }.getVakue() == null
any{ it.getKey() == 'value' }.getVakue() != null
any{ it.getKey().equals('value') }.getVakue() != null
```
#### Ссылки на ресурсы
* [docs.groovy-lang.org](https://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html)
* [www.baeldung.com](https://www.baeldung.com/groovy-maps)
* [groovy-gpath-in-rest-assured-part1-overview](https://www.james-willett.com/groovy-gpath-in-rest-assured-part1-overview/)
* [rest-assured-gpath-json](https://www.james-willett.com/rest-assured-gpath-json/)
* [www.tutorialspoint.com](https://www.tutorialspoint.com/groovy/index.htm)
* [ru.wikibooks.org/wiki/Groovy](https://ru.wikibooks.org/wiki/Groovy)